package com.dms.modules.product.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dms.modules.product.entity.UserBrowseHistory;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 用户浏览历史Mapper接口
 * 合并了用户模块和产品模块的浏览历史功能
 */
@Mapper
public interface UserBrowseHistoryMapper extends BaseMapper<UserBrowseHistory> {
    
    /**
     * 获取用户浏览过的分类及其浏览次数，按浏览次数降序排序
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 分类ID和浏览次数的映射
     */
    List<Map<String, Object>> getUserCategoryPreferences(@Param("userId") Long userId, @Param("limit") Integer limit);
    
    /**
     * 获取用户最近浏览的商品列表
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 浏览历史列表
     */
    List<UserBrowseHistory> getRecentBrowsedProducts(@Param("userId") Long userId, @Param("limit") Integer limit);
    
    /**
     * 更新用户浏览记录
     *
     * @param userId 用户ID
     * @param productId 商品ID
     * @return 影响行数
     */
    int updateBrowseCount(@Param("userId") Long userId, @Param("productId") Long productId);
    
    /**
     * 获取用户浏览记录总数
     *
     * @param userId 用户ID
     * @return 浏览记录总数
     */
    int countUserBrowseHistory(@Param("userId") Long userId);
    
    /**
     * 获取用户在某个时间段内的浏览记录
     *
     * @param userId 用户ID
     * @param days 天数，如30表示最近30天
     * @return 浏览历史列表
     */
    List<UserBrowseHistory> getBrowseHistoryInDays(@Param("userId") Long userId, @Param("days") Integer days);
    
    /**
     * 获取用户浏览过的商品ID列表
     *
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 商品ID列表
     */
    List<Long> getBrowsedProductIds(@Param("userId") Long userId, @Param("limit") Integer limit);
    
    /**
     * 获取用户最近一次浏览商品的时间
     *
     * @param userId 用户ID
     * @param productId 商品ID
     * @return 最近浏览时间
     */
    Date getLastBrowseTime(@Param("userId") Long userId, @Param("productId") Long productId);
    
    /**
     * 批量插入浏览历史
     *
     * @param historyList 浏览历史列表
     * @return 影响行数
     */
    int batchInsert(@Param("list") List<UserBrowseHistory> historyList);
    
    /**
     * 删除用户特定商品的浏览记录
     *
     * @param userId 用户ID
     * @param productId 商品ID
     * @return 影响行数
     */
    int deleteUserBrowseHistory(@Param("userId") Long userId, @Param("productId") Long productId);
    
    /**
     * 清空用户所有浏览记录
     *
     * @param userId 用户ID
     * @return 影响行数
     */
    int clearUserBrowseHistory(@Param("userId") Long userId);
} 